home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- from rdflib.store import Store
- from rdflib.URIRef import URIRef
- from bsddb import db
- from os import mkdir
- from os.path import exists, abspath
- from urllib import pathname2url
- from threading import Thread
- import logging
- _logger = logging.getLogger(__name__)
-
- class Sleepycat(Store):
- context_aware = True
- formula_aware = True
-
- def __init__(self, configuration = None, identifier = None):
- self._Sleepycat__open = False
- self._Sleepycat__identifier = identifier
- super(Sleepycat, self).__init__(configuration)
- self.configuration = configuration
- self._loads = self.node_pickler.loads
- self._dumps = self.node_pickler.dumps
-
-
- def __get_identifier(self):
- return self._Sleepycat__identifier
-
- identifier = property(__get_identifier)
-
- def open(self, path, create = True):
- homeDir = path
- envsetflags = db.DB_CDB_ALLDB
- envflags = db.DB_INIT_MPOOL | db.DB_INIT_CDB | db.DB_THREAD
- if not exists(homeDir):
- if create == True:
- mkdir(homeDir)
- self.create(path)
- else:
- return -1
- create == True
- if self._Sleepycat__identifier is None:
- self._Sleepycat__identifier = URIRef(pathname2url(abspath(homeDir)))
-
- self.db_env = db_env = db.DBEnv()
- db_env.set_cachesize(0, 52428800)
- db_env.set_flags(envsetflags, 1)
- db_env.open(homeDir, envflags | db.DB_CREATE)
- self._Sleepycat__open = True
- dbname = None
- dbtype = db.DB_BTREE
- dbopenflags = db.DB_THREAD
- dbmode = 432
- dbsetflags = 0
- self._Sleepycat__indicies = [
- None] * 3
- self._Sleepycat__indicies_info = [
- None] * 3
- for i in xrange(0, 3):
- index_name = to_key_func(i)(('s', 'p', 'o'), 'c')
- index = db.DB(db_env)
- index.set_flags(dbsetflags)
- index.open(index_name, dbname, dbtype, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__indicies[i] = index
- self._Sleepycat__indicies_info[i] = (index, to_key_func(i), from_key_func(i))
-
- lookup = { }
- for i in xrange(0, 8):
- results = []
- for start in xrange(0, 3):
- score = 1
- len = 0
- for j in xrange(start, start + 3):
- if i & 1 << j % 3:
- score = score << 1
- len += 1
- continue
-
- tie_break = 2 - start
- results.append(((score, tie_break), start, len))
-
- results.sort()
- (score, start, len) = results[-1]
-
- def get_prefix_func(start, end):
-
- def get_prefix(triple, context):
- if context is None:
- yield ''
- else:
- yield context
- i = start
- while i < end:
- yield triple[i % 3]
- i += 1
- yield ''
-
- return get_prefix
-
- lookup[i] = (self._Sleepycat__indicies[start], get_prefix_func(start, start + len), from_key_func(start), results_from_key_func(start, self._from_string))
-
- self._Sleepycat__lookup_dict = lookup
- self._Sleepycat__contexts = db.DB(db_env)
- self._Sleepycat__contexts.set_flags(dbsetflags)
- self._Sleepycat__contexts.open('contexts', dbname, dbtype, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__namespace = db.DB(db_env)
- self._Sleepycat__namespace.set_flags(dbsetflags)
- self._Sleepycat__namespace.open('namespace', dbname, dbtype, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__prefix = db.DB(db_env)
- self._Sleepycat__prefix.set_flags(dbsetflags)
- self._Sleepycat__prefix.open('prefix', dbname, dbtype, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__k2i = db.DB(db_env)
- self._Sleepycat__k2i.set_flags(dbsetflags)
- self._Sleepycat__k2i.open('k2i', dbname, db.DB_HASH, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__i2k = db.DB(db_env)
- self._Sleepycat__i2k.set_flags(dbsetflags)
- self._Sleepycat__i2k.open('i2k', dbname, db.DB_RECNO, dbopenflags | db.DB_CREATE, dbmode)
- self._Sleepycat__needs_sync = False
- t = Thread(target = self._Sleepycat__sync_run)
- t.setDaemon(True)
- t.start()
- self._Sleepycat__sync_thread = t
- return 1
-
-
- def __sync_run(self):
- sleep = sleep
- time = time
- import time
-
- try:
- (min_seconds, max_seconds) = (10, 300)
- while self._Sleepycat__open:
- if self._Sleepycat__needs_sync:
- t0 = t1 = time()
- self._Sleepycat__needs_sync = False
- while self._Sleepycat__open:
- sleep(0.1)
- if self._Sleepycat__needs_sync:
- t1 = time()
- self._Sleepycat__needs_sync = False
-
- if time() - t1 > min_seconds or time() - t0 > max_seconds:
- self._Sleepycat__needs_sync = False
- _logger.debug('sync')
- self.sync()
- break
- continue
- continue
- sleep(1)
- except Exception:
- e = None
- _logger.exception(e)
-
-
-
- def sync(self):
- if self._Sleepycat__open:
- for i in self._Sleepycat__indicies:
- i.sync()
-
- self._Sleepycat__contexts.sync()
- self._Sleepycat__namespace.sync()
- self._Sleepycat__prefix.sync()
- self._Sleepycat__i2k.sync()
- self._Sleepycat__k2i.sync()
-
-
-
- def close(self, commit_pending_transaction = False):
- self._Sleepycat__open = False
- self._Sleepycat__sync_thread.join()
- for i in self._Sleepycat__indicies:
- i.close()
-
- self._Sleepycat__contexts.close()
- self._Sleepycat__namespace.close()
- self._Sleepycat__prefix.close()
- self._Sleepycat__i2k.close()
- self._Sleepycat__k2i.close()
- self.db_env.close()
-
-
- def add(self, .1, context, quoted = False):
- ''' Add a triple to the store of triples.
- '''
- (subject, predicate, object) = .1
- if not self._Sleepycat__open:
- raise AssertionError, 'The Store must be open.'
- if not context != self:
- raise AssertionError, 'Can not add triple directly to store'
- Store.add(self, (subject, predicate, object), context, quoted)
- _to_string = self._to_string
- s = _to_string(subject)
- p = _to_string(predicate)
- o = _to_string(object)
- c = _to_string(context)
- (cspo, cpos, cosp) = self._Sleepycat__indicies
- value = cspo.get('%s^%s^%s^%s^' % (c, s, p, o))
- if value is None:
- self._Sleepycat__contexts.put(c, '')
- if not cspo.get('%s^%s^%s^%s^' % ('', s, p, o)):
- pass
- contexts_value = ''
- contexts = set(contexts_value.split('^'))
- contexts.add(c)
- contexts_value = '^'.join(contexts)
- if not contexts_value != None:
- raise AssertionError
- cspo.put('%s^%s^%s^%s^' % (c, s, p, o), '')
- cpos.put('%s^%s^%s^%s^' % (c, p, o, s), '')
- cosp.put('%s^%s^%s^%s^' % (c, o, s, p), '')
- self._Sleepycat__needs_sync = True
-
-
-
- def __remove(self, .1, c, quoted = False):
- (s, p, o) = .1
- (cspo, cpos, cosp) = self._Sleepycat__indicies
- if not cspo.get('^'.join(('', s, p, o, ''))):
- pass
- contexts_value = ''
- contexts = set(contexts_value.split('^'))
- contexts.discard(c)
- contexts_value = '^'.join(contexts)
- for i, _to_key, _from_key in self._Sleepycat__indicies_info:
- i.delete(_to_key((s, p, o), c))
-
- if not quoted:
- if contexts_value:
- for i, _to_key, _from_key in self._Sleepycat__indicies_info:
- i.put(_to_key((s, p, o), ''), contexts_value)
-
- else:
- for i, _to_key, _from_key in self._Sleepycat__indicies_info:
-
- try:
- i.delete(_to_key((s, p, o), ''))
- continue
- except db.DBNotFoundError:
- e = None
- continue
-
-
-
-
-
-
- def remove(self, .1, context):
- (subject, predicate, object) = .1
- if not self._Sleepycat__open:
- raise AssertionError, 'The Store must be open.'
- Store.remove(self, (subject, predicate, object), context)
- _to_string = self._to_string
- if context is not None:
- if context == self:
- context = None
-
-
- if subject is not None and predicate is not None and object is not None and context is not None:
- s = _to_string(subject)
- p = _to_string(predicate)
- o = _to_string(object)
- c = _to_string(context)
- value = self._Sleepycat__indicies[0].get('%s^%s^%s^%s^' % (c, s, p, o))
- if value is not None:
- self._Sleepycat__remove((s, p, o), c)
- self._Sleepycat__needs_sync = True
-
- else:
- (cspo, cpos, cosp) = self._Sleepycat__indicies
- (index, prefix, from_key, results_from_key) = self._Sleepycat__lookup((subject, predicate, object), context)
- cursor = index.cursor()
-
- try:
- current = cursor.set_range(prefix)
- needs_sync = True
- except db.DBNotFoundError:
- current = None
- needs_sync = False
-
- cursor.close()
- while current:
- (key, value) = current
- cursor = index.cursor()
-
- try:
- cursor.set_range(key)
- current = cursor.next()
- except db.DBNotFoundError:
- current = None
-
- cursor.close()
- if key.startswith(prefix):
- (c, s, p, o) = from_key(key)
- if context is None:
- if not index.get(key):
- pass
- contexts_value = ''
- contexts = set(contexts_value.split('^'))
- contexts.add('')
- for c in contexts:
- for i, _to_key, _ in self._Sleepycat__indicies_info:
- i.delete(_to_key((s, p, o), c))
-
-
- else:
- self._Sleepycat__remove((s, p, o), c)
- context is None
- break
- if context is not None:
- if subject is None and predicate is None and object is None:
-
- try:
- self._Sleepycat__contexts.delete(_to_string(context))
- except db.DBNotFoundError:
- e = None
- except:
- None<EXCEPTION MATCH>db.DBNotFoundError
-
-
- None<EXCEPTION MATCH>db.DBNotFoundError
-
- self._Sleepycat__needs_sync = needs_sync
-
-
- def triples(self, .1, context = None):
- '''A generator over all the triples matching '''
- (subject, predicate, object) = .1
- if not self._Sleepycat__open:
- raise AssertionError, 'The Store must be open.'
- if context is not None:
- if context == self:
- context = None
-
-
- _from_string = self._from_string
- (index, prefix, from_key, results_from_key) = self._Sleepycat__lookup((subject, predicate, object), context)
- cursor = index.cursor()
-
- try:
- current = cursor.set_range(prefix)
- except db.DBNotFoundError:
- current = None
-
- cursor.close()
- while current:
- (key, value) = current
- cursor = index.cursor()
-
- try:
- cursor.set_range(key)
- current = cursor.next()
- except db.DBNotFoundError:
- current = None
-
- cursor.close()
- if key and key.startswith(prefix):
- contexts_value = index.get(key)
- yield results_from_key(key, subject, predicate, object, contexts_value)
- continue
- break
-
-
- def __len__(self, context = None):
- if not self._Sleepycat__open:
- raise AssertionError, 'The Store must be open.'
- if context is not None:
- if context == self:
- context = None
-
-
- if context is None:
- prefix = '^'
- else:
- prefix = '%s^' % self._to_string(context)
- index = self._Sleepycat__indicies[0]
- cursor = index.cursor()
- current = cursor.set_range(prefix)
- count = 0
- while current:
- (key, value) = current
- if key.startswith(prefix):
- count += 1
- current = cursor.next()
- continue
- break
- cursor.close()
- return count
-
-
- def bind(self, prefix, namespace):
- prefix = prefix.encode('utf-8')
- namespace = namespace.encode('utf-8')
- bound_prefix = self._Sleepycat__prefix.get(namespace)
- if bound_prefix:
- self._Sleepycat__namespace.delete(bound_prefix)
-
- self._Sleepycat__prefix[namespace] = prefix
- self._Sleepycat__namespace[prefix] = namespace
-
-
- def namespace(self, prefix):
- prefix = prefix.encode('utf-8')
- return self._Sleepycat__namespace.get(prefix, None)
-
-
- def prefix(self, namespace):
- namespace = namespace.encode('utf-8')
- return self._Sleepycat__prefix.get(namespace, None)
-
-
- def namespaces(self):
- cursor = self._Sleepycat__namespace.cursor()
- results = []
- current = cursor.first()
- while current:
- (prefix, namespace) = current
- results.append((prefix, namespace))
- current = cursor.next()
- cursor.close()
- for prefix, namespace in results:
- yield (prefix, URIRef(namespace))
-
-
-
- def contexts(self, triple = None):
- _from_string = self._from_string
- _to_string = self._to_string
- if triple:
- (s, p, o) = triple
- s = _to_string(s)
- p = _to_string(p)
- o = _to_string(o)
- contexts = self._Sleepycat__indicies[0].get('%s^%s^%s^%s^' % ('', s, p, o))
- if contexts:
- for c in contexts.split('^'):
- if c:
- yield _from_string(c)
- continue
-
-
- else:
- index = self._Sleepycat__contexts
- cursor = index.cursor()
- current = cursor.first()
- cursor.close()
- while current:
- (key, value) = current
- context = _from_string(key)
- yield context
- cursor = index.cursor()
-
- try:
- cursor.set_range(key)
- current = cursor.next()
- except db.DBNotFoundError:
- current = None
-
- cursor.close()
-
-
- def _from_string(self, i):
- k = self._Sleepycat__i2k.get(int(i))
- return self._loads(k)
-
-
- def _to_string(self, term):
- k = self._dumps(term)
- i = self._Sleepycat__k2i.get(k)
- if i is None:
- i = '%s' % self._Sleepycat__i2k.append(k)
- self._Sleepycat__k2i.put(k, i)
-
- return i
-
-
- def __lookup(self, .1, context):
- (subject, predicate, object) = .1
- _to_string = self._to_string
- if context is not None:
- context = _to_string(context)
-
- i = 0
- if subject is not None:
- i += 1
- subject = _to_string(subject)
-
- if predicate is not None:
- i += 2
- predicate = _to_string(predicate)
-
- if object is not None:
- i += 4
- object = _to_string(object)
-
- (index, prefix_func, from_key, results_from_key) = self._Sleepycat__lookup_dict[i]
- prefix = '^'.join(prefix_func((subject, predicate, object), context))
- return (index, prefix, from_key, results_from_key)
-
-
-
- def to_key_func(i):
-
- def to_key(triple, context):
- '''Takes a string; returns key'''
- return '^'.join((context, triple[i % 3], triple[(i + 1) % 3], triple[(i + 2) % 3], ''))
-
- return to_key
-
-
- def from_key_func(i):
-
- def from_key(key):
- '''Takes a key; returns string'''
- parts = key.split('^')
- return (parts[0], parts[((3 - i) + 0) % 3 + 1], parts[((3 - i) + 1) % 3 + 1], parts[((3 - i) + 2) % 3 + 1])
-
- return from_key
-
-
- def results_from_key_func(i, from_string):
-
- def from_key(key, subject, predicate, object, contexts_value):
- '''Takes a key and subject, predicate, object; returns tuple for yield'''
- parts = key.split('^')
- if subject is None:
- s = from_string(parts[((3 - i) + 0) % 3 + 1])
- else:
- s = subject
- if predicate is None:
- p = from_string(parts[((3 - i) + 1) % 3 + 1])
- else:
- p = predicate
- if object is None:
- o = from_string(parts[((3 - i) + 2) % 3 + 1])
- else:
- o = object
- return (((s, p, o),), (lambda .0: for c in .0:
- if c:
- from_string(c)continue)(contexts_value.split('^')))
-
- return from_key
-
-
- def readable_index(i):
- (s, p, o) = '???'
- if i & 1:
- s = 's'
-
- if i & 2:
- p = 'p'
-
- if i & 4:
- o = 'o'
-
- return '%s,%s,%s' % (s, p, o)
-
-